package com.springcloudalibaba.gateway.configurer;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.reactive.CorsWebFilter;
import org.springframework.web.cors.reactive.UrlBasedCorsConfigurationSource;
import org.springframework.web.util.pattern.PathPatternParser;

/**
 * @描述: 全局网关跨域 TODO 如果之前在单个服务上面配置了跨域，那么就需要把那些配置删掉
 * @作者: lixing
 * @日期 2021/6/16 9:48
 */
@Configuration
public class GlobalCorsConfig {
    /**
     * @描述 跨域配置
     * @作者 lixing
     * @日期 2021/6/22 17:43
     * @Param []
     * @return org.springframework.web.cors.CorsConfiguration
     */
    private CorsConfiguration buildConfig() {
        CorsConfiguration corsConfiguration = new CorsConfiguration();
        // 预检请求的缓存时间（秒），即在这个时间段里，对于相同的跨域请求不会再预检了
        corsConfiguration.setMaxAge(18000L);
        // 允许cookies跨域
        corsConfiguration.setAllowCredentials(true);
        // 允许向该服务器提交请求的URI，*表示全部允许，在SpringMVC中，如果设成*，会自动转成当前请求头中的Origin
        corsConfiguration.addAllowedOrigin("*");
        // 允许访问的头信息,*表示全部
        corsConfiguration.addAllowedHeader("*");
        // 允许提交请求的方法类型，*表示全部允许
        corsConfiguration.addAllowedMethod("*");
        return corsConfiguration;
    }

    /**
     * @描述 自定义跨域过滤器
     * @作者 lixing
     * @日期 2021/6/22 17:49
     * @Param []
     * @return org.springframework.web.cors.reactive.CorsWebFilter
     */
    @Bean
    public CorsWebFilter corsFilter() {
        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(new PathPatternParser());
        source.registerCorsConfiguration("/**", buildConfig());
        return new CorsWebFilter(source);
    }
}
